package cn.emall.cart.service.impl;

import cn.emall.cart.service.CartService;
import cn.emall.jedis.JedisClient;
import cn.emall.mapper.TbItemMapper;
import cn.emall.pojo.TbItem;
import cn.emall.utils.EmallResult;
import cn.emall.utils.JsonUtils;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;

import java.util.ArrayList;
import java.util.List;

/**
 * 购物车处理服务
 */
@Service
public class CartServiceImpl implements CartService{

    @Autowired
    private JedisClient jedisClient;
    @Autowired
    private TbItemMapper tbItemMapper;
    @Value("${REDIS_CART_PRE}")
    private String REDIS_CART_PRE;

    /**
     * 添加购物车
     * @param userId 用户id
     * @param itemId 商品id
     * @param num 数量
     * @return
     */
    @Override
    public EmallResult addCart(long userId, long itemId, int num) {
        //向redis中添加购物车
        //数据类型为hash key:用户id field:商品id value:商品信息
        //判断redis中商品是否存在
        Boolean hexists = jedisClient.hexists(REDIS_CART_PRE + ":" + userId, itemId + "");
        //如果存在把数量相加
        if(hexists){
            String json = jedisClient.hget(REDIS_CART_PRE + ":" + userId, itemId + "");
            TbItem tbItem = JsonUtils.jsonToPojo(json,TbItem.class);
            tbItem.setNum(tbItem.getNum() + num);
            jedisClient.hset(REDIS_CART_PRE + ":" + userId, itemId + "", JsonUtils.objectToJson(tbItem));
            return EmallResult.ok();
        }
        //如果不存在,通过商品id获取商品信息
        TbItem tbItem = tbItemMapper.selectByPrimaryKey(itemId);
        //设置购物车商品数量
        tbItem.setNum((num));
        //取第一张图片
        String image = tbItem.getImage();
        if(StringUtils.isNotBlank(image)){
            tbItem.setImage(image.split(",")[0]);
        }
        //添加到购物车
        jedisClient.hset(REDIS_CART_PRE + ":" + userId, itemId + "", JsonUtils.objectToJson(tbItem));
        return EmallResult.ok();
    }

    /**
     * 用户登录后合并cookie中购物车信息和redis中的购物车信息
     * @param userId 用户id
     * @param itemList 购物车中商品信息
     * @return
     */
    @Override
    public EmallResult mergeCart(long userId, List<TbItem> itemList) {
        //遍历商品列表
        //把列表添加到购物车
        //判断购物车中是否有此商品
        //如果有,更改数量
        //如果没有,添加新的商品
        for (TbItem item:itemList) {
            addCart(userId,item.getId(),item.getNum());
        }
        return EmallResult.ok();
    }

    /**
     * 展示购物车信息
     * @param userId 用户id
     * @return
     */
    @Override
    public List<TbItem> getCartList(long userId) {
        //根据用户id查询redis中购物车信息
        List<String> jsonList = jedisClient.hvals(REDIS_CART_PRE + ":" + userId);
        List<TbItem> itemList = new ArrayList<>();
        for (String s:jsonList){
            //创建一个TbItem对象
            TbItem tbItem = JsonUtils.jsonToPojo(s,TbItem.class);
            //添加到列表
            itemList.add(tbItem);
        }
        return itemList;
    }

    /**
     * 更新购物车商品数量
     * @param userId 用户id
     * @param itemId
     * @param num
     * @return
     */
    @Override
    public EmallResult updateCartNum(long userId, long itemId, int num) {
        //从redis中获取商品信息
        String json = jedisClient.hget(REDIS_CART_PRE + ":" + userId, itemId + "");
        TbItem tbItem = JsonUtils.jsonToPojo(json,TbItem.class);
        //更新商品数量
        tbItem.setNum(num);
        //写入redis
        jedisClient.hset(REDIS_CART_PRE + ":" + userId, itemId + "", JsonUtils.objectToJson(tbItem));
        return EmallResult.ok();
    }

    /**
     * 删除购物车
     * @param userId 用户id
     * @param itemId 商品id
     * @return
     */
    @Override
    public EmallResult deleteCartItem(long userId, long itemId) {
        //删除购物车商品
        jedisClient.hdel(REDIS_CART_PRE + ":" + userId, itemId +"");
        return EmallResult.ok();
    }

    /**
     * 删除购物车信息
     * @param userId
     * @return
     */
    @Override
    public EmallResult clearCartItem(long userId) {
        //删除购物车信息
        jedisClient.del(REDIS_CART_PRE + ":" + userId);
        return EmallResult.ok();
    }
}
